<?php
class Salario extends BaseModel
{
    protected $salarioid;
    protected $cargoid;
    protected $contratoid;
    protected $salario;
    protected $iniciovigencia;
    protected $fimvigencia;
    protected $a_previdenciasocial;
    protected $a_fgts;
    protected $a_salarioeducacao;
    protected $a_sesi_sesc;
    protected $a_senai_senac;
    protected $a_seguroacidentetrabalho;
    protected $a_sebrae;
    protected $a_incra;
    protected $b_avisoprevio;
    protected $b_fgts;
    protected $b_faltas;
    protected $b_auxiliodoenca;
    protected $c_ferias;
    protected $c_13salario;
    protected $c_13ferias;
    protected $d_incidencia12;
    protected $e_iss;
    protected $e_cofins;
    protected $e_pis;
    protected $e_csll;
    protected $e_ir;
    protected $he;
    protected $va;
    protected $vt;
    protected $farda;
    protected $taxaadministracao;
    protected $insalubridade;
    protected $periculosidade;
    protected $cestabasica;
    protected $outros_lucro;
    protected $outros_depreciacaoequipamento;
    protected $outros_municao;
    protected $outros_segurovida;
    protected $outros_auxiliofuneral;
    protected $adcionalnoturno;
    protected $outros_treinamento;
    protected $supervisaoronda;

    const tablename = "salario";
    const tablekey = "salarioid";
    const tablesequence = "salario_salarioid_seq";

    const SALARIO_MINIMO = 510; // salário mínimo
    
    public function __construct($objetoid=null,$contratoid =null,$cargoid=null){
         
        if (($cargoid !== null) and ($contratoid!==null)){
            $sql = "Select * from ".$this->getTableName()." where cargoid = $cargoid and contratoid = $contratoid ORDER BY fimvigencia DESC LIMIT 1 ";
            $result = TUtils::CriarResultSet($sql);
            if(pg_num_rows($result)>0){
                $dbobj = pg_fetch_object($result);
                $key = $this->getTableKey();
                $objetoid = $dbobj->$key;
            }
        }
         
        parent::__construct($objetoid);
    }

    /**
     *
     * @param $contratoid
     * @param $cargoid
     * @return Salario
     */
    public function carregarSalarioVigente( $contratoid = NULL, $cargoid = NULL )
    {
         
        if ( $contratoid == NULL ){
            if ( $this->contratoid == NULL )
            return FALSE;
            else
            $contratoid = $this->contratoid;
        }
         
        if ( $cargoid == NULL ){
            if ( $this->cargoid == NULL )
            return new Salario();
            else
            $cargoid = $this->contratoid;
        }
         
        $sql = "SELECT *
        			FROM ".$this->getTableName()." 
        			WHERE 
        				cargoid = $cargoid AND 
        				contratoid = $contratoid AND 
        				(
        					date(now()) >= iniciovigencia AND date(now()) <= fimvigencia
        				)";

        $result = TUtils::CriarResultSet($sql);

        if(pg_num_rows($result)>0){
            $dbobj = pg_fetch_object($result);
            $key = $this->getTableKey();
            $objetoid = $dbobj->$key;

            $this->__construct($objetoid);
        } else {
            $this->__construct( NULL, $contratoid, $cargoid );
        }
         
    }

    public function getCargo()
    {
        return new Cargo( $this->cargoid );
    }

    public function getSalarioMinimo()
    {
        return Salario::SALARIO_MINIMO;
    }
    
    public static function listarView($contratoid, $form=null)
    {
        $view  = new ViewSalarios();
        $criterio = ($form)?$form:array ("campo"=>"", "operador"=>"", "valor"=>"");
        $criterio['precondicao'] ='';
         
        $criterio['orderBy'] ='cargo';
        $criterio['precondicao'] = "contratoid = $contratoid";

        if ($criterio['campo'] == 'SALARIO BASE' or $criterio['campo'] == 'TOTAL MENSAL'){
            $criterio['campo']='';
            $criterio['operador']='';
            $criterio['valor'] ='';
            if ($form['operador'] == 'ilike')
            $form['operador'] = '=';
            if (is_numeric($form['valor'])){
                if ($form['campo'] == 'SALARIO BASE')
                $criterio['precondicao'] .= ' and "salario base" '.$form['operador'].' '.$form['valor'];
                else
                $criterio['precondicao'] .= ' and "total mensal" '.$form['operador'].' '.$form['valor'];
            }
        }
         
        return $view->listar($criterio);
    }


    function listarCargos($contratoId,$salarioId=null,$cargoId=null){

        $sql = "
	            SELECT DISTINCT(v.cargoid) as id, c.descricao as nome
				FROM  vaga v
				JOIN cargos c ON c.cargoid = v.cargoid
				WHERE v.contratoid = $contratoId 
				ORDER BY c.descricao
				";		

        return TUtils::CriarResultSet($sql);

    }



    public function salvar() {

        //Transformações
        $this->a_incra 					= TUtils::PerToNum($this->a_incra);
        $this->a_sebrae 				= TUtils::PerToNum($this->a_sebrae);
        $this->a_seguroacidentetrabalho = TUtils::PerToNum($this->a_seguroacidentetrabalho);
        $this->a_senai_senac 			= TUtils::PerToNum($this->a_senai_senac);
        $this->a_sesi_sesc 				= TUtils::PerToNum($this->a_sesi_sesc);
        $this->a_salarioeducacao 		= TUtils::PerToNum($this->a_salarioeducacao);
        $this->a_fgts 					= TUtils::PerToNum($this->a_fgts);
        $this->a_previdenciasocial 		= TUtils::PerToNum($this->a_previdenciasocial);
        $this->b_auxiliodoenca 			= TUtils::PerToNum($this->b_auxiliodoenca);
        $this->b_faltas 				= TUtils::PerToNum($this->b_faltas);
        $this->b_fgts 					= TUtils::PerToNum($this->b_fgts);
        $this->b_avisoprevio 			= TUtils::PerToNum($this->b_avisoprevio);
        $this->c_13ferias 				= TUtils::PerToNum($this->c_13ferias);
        $this->c_13salario 				= TUtils::PerToNum($this->c_13salario);
        $this->c_ferias 				= TUtils::PerToNum($this->c_ferias);
        $this->d_incidencia12 			= TUtils::PerToNum($this->d_incidencia12);
        $this->e_pis 					= TUtils::PerToNum($this->e_pis);
        $this->e_cofins 				= TUtils::PerToNum($this->e_cofins);
        $this->e_iss 					= TUtils::PerToNum($this->e_iss);
        $this->e_csll 					= TUtils::PerToNum($this->e_csll);
        $this->e_ir 					= TUtils::PerToNum($this->e_ir);

        $this->salario 					= TUtils::DecToNum( $this->salario );
        $this->va 						= TUtils::DecToNum( $this->va );
        $this->vt 						= TUtils::DecToNum( $this->vt );
        $this->he 						= TUtils::DecToNum( $this->he );
        $this->farda 					= TUtils::DecToNum( $this->farda );
        $this->insalubridade 			= TUtils::DecToNum( $this->insalubridade );
        $this->periculosidade 			= TUtils::DecToNum( $this->periculosidade );
        $this->cestabasica 				= TUtils::DecToNum( $this->cestabasica );

        $this->iniciovigencia 			= TUtils::DataPtEn($this->iniciovigencia);
        $this->fimvigencia 				= TUtils::DataPtEn($this->fimvigencia);
        $this->taxaadministracao 		= TUtils::DecToNum($this->taxaadministracao);
         
        $this->outros_lucro						= TUtils::DecToNum( $this->outros_lucro );
        $this->outros_depreciacaoequipamento	= TUtils::DecToNum( $this->outros_depreciacaoequipamento );
        $this->outros_municao					= TUtils::DecToNum( $this->outros_municao );
        $this->outros_segurovida				= TUtils::DecToNum( $this->outros_segurovida );
        $this->outros_auxiliofuneral			= TUtils::DecToNum( $this->outros_auxiliofuneral );
        $this->outros_treinamento				= TUtils::DecToNum( $this->outros_treinamento );
         
        $this->adcionalnoturno					= TUtils::DecToNum( $this->adcionalnoturno );
        $this->supervisaoronda					= TUtils::DecToNum( $this->supervisaoronda );
         
         
        //Validações
        if ( $this->iniciovigencia  == $this->fimvigencia ) throw new Exception( "Vigência inválida." );
        if ( strlen($this->salario) > 11 )				throw new Exception( "Valor salário inválido." );
        if ( strlen($this->taxaadministracao) > 11 )	throw new Exception( "Valor taxa administração inválido." );
        if ( strlen($this->va) > 11 )					throw new Exception( "Valor vale alimentação inválido." );
        if ( strlen($this->vt) > 11 )					throw new Exception( "Valor vale transporte inválido." );
        if ( strlen($this->he) > 11 )					throw new Exception( "Valor hora extra inválido." );
        if ( strlen($this->farda) > 11)					throw new Exception( "Valor farda inválido." );
        if ( strlen($this->insalubridade) > 11 )		throw new Exception( "Valor insalubridade inválido." );
        if ( strlen($this->periculosidade) > 11 )		throw new Exception( "Valor periculosidade inválido." );
        if ( strlen($this->cestabasica) > 11 )			throw new Exception( "Valor cesta básica inválido." );
         
        if(!is_numeric($this->salario)) {
            throw new Exception("Erro: Salário deve ser numérico");
        }

        if(!is_numeric($this->farda)) {
            throw new Exception("Erro: Farda deve ser numérico");
        }

        if(!is_numeric($this->he)) {
            throw new Exception("Erro: Horas Extras deve ser numérico");
        }

        if(!is_numeric($this->va)) {
            throw new Exception("Erro: Vale Refeição deve ser numérico");
        }

        if(!is_numeric($this->vt)) {
            throw new Exception("Erro: Vale Transporte deve ser numérico");
        }

        if ($this->fimvigencia
        AND (strtotime($this->iniciovigencia) > strtotime($this->fimvigencia))
        ) {
            throw new Exception(
            "Erro: Início da vigência não deve ser maior que a data de fim.");
        }

        if ($this->salario < $this->getSalarioMinimo()) {
            throw new Exception('O salário não deve ser menor que o mínimo.');
        }
        
        if (isset($this->cargoid) AND ($this->cargoid == 0 OR $this->cargoid == NULL)) {
            throw new Exception('O cargo deve ser selecionado.');
        }
        
        #Validação: so permite casos onde o 'intervalo da vigencia' esta ANTES ou DEPOIS de uma vigencia de salario já cadastrado.
        if (is_null($this->salarioid)) {
            $result = TUtils::CriarResultSet("
    	       SELECT * FROM salario WHERE
    	       cargoid = " . $this->cargoid . "
    	       AND contratoid = " . $this->contratoid . "
    	       AND NOT
    	           (fimvigencia < '" . TUtils::DataEnPt($this->iniciovigencia) . "'
    	           OR iniciovigencia > '" . TUtils::DataEnPt($this->fimvigencia) . "')
    	       ");
            if (pg_num_rows($result) > 0) {
                throw new Exception("Já EXISTE salário cadastrado para o cargo informado dentro da mesma VIGÊNCIA.");
            }
        }
        else {
            $result = TUtils::CriarResultSet("
        		  SELECT * FROM salario WHERE
        		  cargoid = " . $this->cargoid . "
        		  AND contratoid = " . $this->contratoid . "
        		  AND salarioid <> " . $this->salarioid . "
        		  AND NOT
        		      (fimvigencia < '" . TUtils::DataEnPt($this->iniciovigencia) . "'
                      OR iniciovigencia > '" . TUtils::DataEnPt($this->fimvigencia) . "')
        		");
            if (pg_num_rows($result) > 0) {
                throw new Exception("Já EXISTE salário cadastrado para o cargo informado dentro da mesma VIGÊNCIA.");
            }
        }

        parent::salvar();
    }

    public function somatorioEncargos(){
        $s  = 0;
        $s += $this->a_fgts;
        $s += $this->a_incra;
        $s += $this->a_previdenciasocial;
        $s += $this->a_salarioeducacao;
        $s += $this->a_sebrae;
        $s += $this->a_seguroacidentetrabalho;
        $s += $this->a_senai_senac;
        $s += $this->a_sesi_sesc;
        $s += $this->b_auxiliodoenca;
        $s += $this->b_avisoprevio;
        $s += $this->b_faltas;
        $s += $this->b_fgts;
        $s += $this->c_13ferias;
        $s += $this->c_13salario;
        $s += $this->c_ferias;
        $s += $this->d_incidencia12;
        return $s;
    }

    public function valorEncargos(){
        $soma = $this->salario + $this->adcionalnoturno + $this->periculosidade + $this->he + $this->insalubridade;
        return ( $soma * $this->somatorioEncargos() )/100;
    }

    public function somatorioTributos(){
        $s  = 0;
        $s += $this->e_iss;
        $s += $this->e_cofins;
        $s += $this->e_pis;
        $s += $this->e_csll;
        $s += $this->e_ir;
        return $s;
    }

    public function valorTributos() {
        $soma = $this->montanteA() + $this->beneficios() + $this->outros() + $this->taxaadministracao;
        return ( $soma * $this->somatorioTributos() )/100;
    }


    public function beneficios() {
        return ($this->va + $this->vt + $this->farda);
    }

    public function outros() {
        $result =  $this->outros_lucro + $this->outros_municao + $this->cestabasica + $this->outros_depreciacaoequipamento +
        $this->outros_segurovida + $this->outros_auxiliofuneral + $this->supervisaoronda + $this->outros_treinamento;
        return $result;
    }

    public function montanteA() {
        return $this->salario + $this->adcionalnoturno + $this->periculosidade + $this->he + $this->insalubridade + $this->valorEncargos();
    }

    public function montanteB() {
        return $this->beneficios() + $this->outros() + $this->taxaadministracao + $this->valorTributos();
    }

    public function totalMensal() {
        return $this->montanteA() + $this->montanteB();
    }
}
?>